﻿
using M2B.GestionEntretiens.POCOS;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace M2B.GestionEntretiens.DAL
{
    /// <summary>
    /// Cette interface décrit la création, la lecture, la mise à jour et la suppression 
    /// de l'entité Candidat (CRUD opérations)
    /// </summary>
    /// <remarks>
    /// Informations de l'interface : 
    /// <list type="bullet">
    /// <item name="authors">Auteur : M2B : Bilel / Maher SAMMARI</item>
    /// <item name="creation date">Date de création : 01/04/2014</item>
    /// <item name="last modification">Date de dernière modification : 01/04/2014</item>
    /// </list>
    /// </remarks>
    interface IEntityRepositoryS<T> where T : class
    {
        /// <summary>
        /// Ajout
        /// </summary>
        /// <param name="entity">Entity</param>
        void Add(T entity);
        /// <summary>
        /// Mise à jour
        /// </summary>
        /// <param name="entity">Entity</param>
        void Update(T entity);
        /// <summary>
        /// Suppression
        /// </summary>
        /// <param name="entity">Entity</param>
        void Delete(T entity);
        /// <summary>
        /// Suppression 
        /// </summary>
        /// <param name="predicate">Predicat</param>
        void Delete(Func<T, bool> predicate);
        /// <summary>
        /// Récupération selon identificateur
        /// </summary>
        /// <param name="id">Identificateur</param>
        /// <returns>Entity</returns>
        T GetById(long id);
        /// <summary>
        /// Récupération d'un élément selon la condition
        /// </summary>
        /// <param name="where">Condition</param>
        /// <returns>Entity</returns>
        T Get(Func<T, bool> where);
        /// <summary>
        /// Récupération de tous les élements
        /// </summary>
        /// <returns>Entities</returns>
        IEnumerable<T> GetAll();
        /// <summary>
        /// Récupération d'une liste d'élément selon une condition
        /// </summary>
        /// <param name="where"></param>
        /// <returns>Entities</returns>
        IEnumerable<T> GetMany(Func<T, bool> where);
        /// <summary>
        /// Sauvegarde de l'élement
        /// </summary>
        void Save();
        /// <summary>
        /// Déstruction de l'élément
        /// </summary>
        void Dispose(bool disposing);
    }
}
